package com.ctshk.rpc.order.train.service;

import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.common.vo.OrderRefundDTO;
import com.ctshk.rpc.order.train.dto.*;
import com.ctshk.rpc.order.train.enums.ActionEnum;
import com.ctshk.rpc.order.train.req.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 火车票订单表 服务类
 * </p>
 *
 * @author 彭柳霖
 * @since 2021-03-17
 */
public interface ITrainOrderService{

    /**
     * 请求来源
     * @return
     */
    ActionEnum getActionType();

    /**
     * 填写订单信息
     * @param trainPlaceOrderReq
     * @param user
     * @return
     */
    Result addOrder(TrainPlaceOrderReq trainPlaceOrderReq, TokenUser user);

    /**
     * 支付页面查询信息
     * @param id
     * @return
     */
    Result<TrainOrderPayInfoDTO> paymentInfoById(Long id);


    /**
     * 预订中心下单
     *
     * @param reqList 预订中心订单入参
     * @return 返回值
     */
    Result payOrder(Long id, List<TrainPayOrderCollectionReq> reqList, TokenUser user);


    /**
     * 查询挂账额度
     * @param req
     * @return
     */
    Result<QueryQuotaDTO> queryQuota(QueryQuotaReq req);


    /**
     * 取消订单
     * @param cancelOrderReq
     * @param user
     */
    Result cancelOrder(TrainCancelOrderReq cancelOrderReq, TokenUser user);


    /**
     * 火车票线路列表
     * @param trainOrderPageReq
     * @return
     */
    PageResponse<TrainOrderPageDTO> queyList(TrainOrderPageReq trainOrderPageReq, TokenUser user);


    /**
     * 根据订单id查询订单详细信息
     *
     * @param orderId 订单id
     * @return 订单消息
     */
    Result<TrainOrderDetailDTO> queryOrderDetailInfo(Long orderId);


    /**
     * 修改旅客信息
     */
    Result updateBusOrderTourist(TrainOrderTouristReq touristReq, Long userId);


    /**
     * 确认退款
     *
     * @param id
     * @param refundId
     * @param userId
     * @return
     */
    Result confirmRefund(Long id, Long refundId, Long userId);
    /**
     * 确认退款
     *
     * @param id
     * @param refundId
     * @param userId
     * @return
     */
    Result confirmRefund(Long id, Long userId);

    /**
     * 退款审批
     * @param req
     * @param tokenUser
     * @return
     */
    Result refundApproval(TrainOrderRefundApprovalReq req, TokenUser tokenUser);

    /**
     * 确认火车订单
     * @param req
     * @return
     */
    Result TrainOrder(TrainOrderConfirmReq req, TokenUser tokenUser);


    /**
     * 确认订单后的相关巴士处理
     * @param req
     * @return
     */
    Result refreshByConfirmOrder(TrainRefreshByConfirmOrderReq req, TokenUser tokenUser);

    /**
     * 获取退款记录列表(财务-内部接口)
     *
     * @param orderNumber 订单编号
     * @return
     */
    List<OrderRefundDTO> getRefundList(String orderNumber);

    /**
     * 供应商确认火车订单
     * @return
     */
    Result<Void> supplieConfirmOrder(TrainOrderSupplieConfirmReq req, Long userId);

    Result sendMessageToTourist(TrainOrderSendMessageToTouristReq sendMessageToTouristReq);

    Integer findBusProduct7DaySaleCount(Long id);

    /**
     * 最近一次查询结束时间到当前时间的数据
     */
    Result<List<TrainOrderDetailDTO>> recentToNow(LocalDateTime recent, LocalDateTime now);

    /**
     * 最近一次查询结束时间到当前时间的订单DTO
     */
    List<TrainOrderDTO> queryOrderDTOList(LocalDateTime start, LocalDateTime end);
}
